package com.ruijie.acl.service;

import java.util.List;

import com.ruijie.acl.AccessGroup;
import com.ruijie.acl.Ace;
import com.ruijie.acl.AclDevice;
import com.ruijie.acl.TimeRange;
import com.ruijie.acl.task.model.AclDeviceInfo;
import com.ruijie.emp.device.Device;
import com.ruijie.foundation.annotation.DomainService;
import com.ruijie.foundation.dao.support.Page;
import com.ruijie.foundation.service.Repository;

/**
 * <p>
 * Title: ACL组服务接口类
 * </p>
 * <p>
 * Description: 为ACL组模块提供逻辑处理，以及数据库的操作。
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: Ruijie Co., Ltd.
 * </p>
 * <p>
 * Create Time: 2009-07-15
 * </p>
 * <p>
 * Update Time:
 * </p>
 * <p>
 * Updater:
 * </p>
 * <p>
 * Update Comments:
 * </p>
 * @author ASAI
 */
@DomainService
public interface AccessGroupService extends Repository<AccessGroup> {

	/**
	 * 分页查询
	 * 
	 * @param access ACL组
	 * @param pageNo 页数
	 * @param pageSize 每页显示的记录数
	 * @return ACL组列表
	 */
	public Page pageQuery(AccessGroup access, int pageNo, int pageSize);
	
	/**
	 * ACL组名称重复验证
	 * 
	 * @param name ACL组名称	
	 * @param id 本身的ID
	 * @return true or false
	 */
	public boolean isExistGroupName(String name,Long id);
	
	/**
	 * 取得ACL组的所有信息，包括ACE的列表
	 * @param accessGroup 组信息
	 * @return 组信息
	 */
	public AccessGroup getDetail(AccessGroup accessGroup);

	
	/**
	 * 分页查询可选择的ACL组
	 * 
	 * @param ids 已经选择的ACL组id列表
	 * @param accessGroup 筛选条件
	 * @param pageNo 页数
	 * @param pageSize 每页显示的记录数
	 * @return ACL组列表
	 */
	public Page pagedQueryAvailableAccessGroups(Object[] ids,AccessGroup accessGroup, int pageNo, int pageSize);

	/**
	 * 分页查询已经选择的ACL组
	 * 
	 * @param ids 已经选择的ACL组id列表
	 * @param pageNo 页数
	 * @param pageSize 每页显示的记录数
	 * @return ACL组列表
	 */
	public Page pagedQuerySelectedAccessGroups(Object[] ids, int pageNo, int pageSize);
	
	/**
	 * 根据名称取得ACL组信息
	 * 
	 * @param name ACl组名称
	 * 
	 * @return List 组信息
	 */
	public List<AccessGroup> getAccessGroupByName(String name);
	
	/**
	 * 根据名称取得无ACL设备的ACL组信息
	 * 
	 * @param name
	 *            ACL组名称
	 * @param aclDevice
	 * 			  ACL设备
	 * 
	 * @return ACL组信息
	 */
	public AccessGroup getByNameWithAclDevice(String name, AclDevice aclDevice);
	
	/**
	 * 根据名称取得无ACL设备的ACL组信息
	 * 
	 * @param name
	 *            ACl组名称
	 * 
	 * @return ACL组信息
	 */
	public AccessGroup getByNameWithoutAclDevice(String name);
	/**
	 * 根据时间段列表取得与之相关的组信息
	 * @return 组列表
	 */
	public List<AccessGroup> findByTimeRange(List<TimeRange> timeRangeList);
	/**
	 * <p>根据ID字符串取得ACL组信息</p>
	 * <p>ID字符串使用逗号(,)分隔</p> 
	 * @return ACL组信息列表
	 */
	public List<AccessGroup> findByIds(String ids);
	
	/**
	 * <p>根据ID数组取得ACL组信息</p>
	 * @return ACL组信息列表
	 */
	public List<AccessGroup> findByIds(Long[] ids);
	
	/**
	 * 从文本中导入ACL组信息
	 * @param acldevice　acl设备
	 */
	public List<String[]> loadAccessGroup(AclDeviceInfo deviceInfo);
	/**
	 * 保存时间段信息
	 * @param timeRangeList 设备的时间段列表
	 */
	public List<String[]> saveTimeRangeInfo2TimeRange(List<TimeRange> timeRangeList);
	
	/**
	 * 通过时间组获得device
	 * @param entity时间组
	 * @return device
	 */
	public List<Device> getDevices(AccessGroup entity);
	
	/**
	 * 根据设备取得与之关联的ACL组信息列表
	 * @param device　ACL设备
	 * @return　组信息列表
	 */
	@SuppressWarnings("unchecked")
	public List<AccessGroup> findByDevice(Device device);
	
	/**
	 * 判断acl组是否与设备关联
	 * @param entity
	 * @return
	 */
	public boolean isRelated2Device(AccessGroup entity);
	
	/**
	 * 获得接口名，inout,组名
	 * @param devices
	 * @param accessGroup
	 * @return
	 */
	public String getInterfaceIds(Device devices,AccessGroup accessGroup);
		
	/**
	 * ACL组详细界面的单设备部署

	 * @param id
	 * @param device
	 */
	public void reConfig(AccessGroup accessGroup,Device device,String dealFlag);
	
	/**
	 * 获得接口名，inout,组名
	 * @param devices
	 * @param accessGroup
	 * @return
	 */
	public String getInterfaceNames(Device devices,AccessGroup accessGroup);

	/**
	 * 保存与指定ACL组列表且包含指定设备对应的ACL设备的ACL组
	 * @param entityList ACL组列表
	 * @param device 设备
	 */
	public void saveSameWithDevice(List<AccessGroup> entityList, Device device);
	
	/**
	 * 保存与指定ACL组相同信息且包含ACL设备的ACL组
	 * @param entity ACL组
	 * @param aclDevice ACL设备
	 * @param aceList 规则列表
	 */
	public void saveSameWithAclDevice(AccessGroup entity, AclDevice aclDevice, List<Ace> aceList);
	
	/**
	 * 删除与指定ACL组对应的所有设备ACL组
	 * @param entity ACL组
	 */
	public void removeWithAclDevice(AccessGroup entity);
	
	/**
	 * 通过acl组删除aclInterface
	 * @param entity
	 */
	public void removeAclInterface(AccessGroup entity);
	
	/**
	 * 更新ACL组的修改标志位
	 * @param list ACL组列表
	 */
	public void updateChangeFlagByAccessGroupList(List<AccessGroup> list);
	
	/**
	 * 取得包含指定ACL设备的ACL组列表
	 * @param aclDevice ACL设备
	 * @return ACL组列表
	 */
	public List<AccessGroup> getByAclDevice(AclDevice aclDevice);
	
	/**
	 * 通过acl组删除aclInterface
	 * @param entity
	 */
	public void removeAclInterface(AccessGroup entity,Device device);
	
	/**
	 * 根据名称取得无ACL设备的ACL组信息，如果该组没有和该设备关联返回NULL
	 * 
	 * @param name
	 *            ACl组名称
	 * 
	 * @return ACL组信息
	 */
	public AccessGroup getByNameWithoutAclDevice(String name,AclDevice aclDevice);
	
}
